package com.zrc.japktool.ui.view;

import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;

import java.util.EnumSet;

// 关键：确保所有LogLevel引用都来自LogTextField2
class Test4 {

    private LogTextField2 logTextField; // 自定义日志控件（LogTextField2类型）

    /**
     * 对外提供方法：创建并返回Test4的完整UI布局（供MainApplication加载）
     */
    public BorderPane createTest4UI() { // 方法名修正为createTest4UI，避免与Test3混淆
        // 1. 初始化自定义日志控件（LogTextField2实例）
        logTextField = new LogTextField2();
        logTextField.setMaxLogLines(500); // 设置最大日志行数为500

        // 2. 创建控制栏（日志发送按钮 + 级别过滤复选框）
        HBox controlBar = createControlBar();

        // 3. 构建主布局（控制栏在上，日志区域在下）
        BorderPane root = new BorderPane();
        root.setTop(controlBar);
        root.setCenter(logTextField);
        root.setPadding(new Insets(10));

        // 初始化日志（发送一条INFO级欢迎日志）
        logTextField.info("日志控件初始化完成，支持DEBUG/INFO/WARN/ERROR分级着色");

        return root; // 返回布局，供MainApplication使用
    }

    /**
     * 创建控制栏：包含日志发送按钮和级别过滤复选框
     */
    private HBox createControlBar() {
        HBox controlBar = new HBox(15);
        controlBar.setPadding(new Insets(10));
        controlBar.setStyle("-fx-background-color: #f0f0f0;");

        // 1. 日志发送按钮（测试不同级别日志）
        Button btnDebug = new Button("发送DEBUG日志");
        Button btnInfo = new Button("发送INFO日志");
        Button btnWarn = new Button("发送WARN日志");
        Button btnError = new Button("发送ERROR日志");
        Button btnClear = new Button("清空日志");

        // 按钮点击事件：发送对应级别日志（调用LogTextField2的方法）
        btnDebug.setOnAction(e -> logTextField.debug("这是DEBUG日志：用户点击了DEBUG按钮（测试信息-----------------------------------------------------------------------------------------------------------------------------------------）"));
        btnInfo.setOnAction(e -> logTextField.info("这是INFO日志：应用正常运行中，当前时间戳已自动添加"));
        btnWarn.setOnAction(e -> logTextField.warn("这是WARN日志：配置文件未找到，将使用默认配置（非致命错误）"));
        btnError.setOnAction(e -> logTextField.error("这是ERROR日志：数据库连接失败！请检查数据库地址和端口"));
        btnClear.setOnAction(e -> logTextField.clearLogs());

        // 2. 日志级别过滤复选框（控制是否显示对应级别日志）
        CheckBox cbDebug = new CheckBox("显示DEBUG");
        CheckBox cbInfo = new CheckBox("显示INFO");
        CheckBox cbWarn = new CheckBox("显示WARN");
        CheckBox cbError = new CheckBox("显示ERROR");
        // 默认全选
        cbDebug.setSelected(true);
        cbInfo.setSelected(true);
        cbWarn.setSelected(true);
        cbError.setSelected(true);

        // 复选框变更事件：更新日志级别过滤（调用修正后的updateLogFilter）
        cbDebug.selectedProperty().addListener((obs, oldVal, newVal) -> updateLogFilter(cbDebug, cbInfo, cbWarn, cbError));
        cbInfo.selectedProperty().addListener((obs, oldVal, newVal) -> updateLogFilter(cbDebug, cbInfo, cbWarn, cbError));
        cbWarn.selectedProperty().addListener((obs, oldVal, newVal) -> updateLogFilter(cbDebug, cbInfo, cbWarn, cbError));
        cbError.selectedProperty().addListener((obs, oldVal, newVal) -> updateLogFilter(cbDebug, cbInfo, cbWarn, cbError));

        // 将控件添加到控制栏
        controlBar.getChildren().addAll(
                btnDebug, btnInfo, btnWarn, btnError, btnClear,
                cbDebug, cbInfo, cbWarn, cbError
        );

        return controlBar;
    }

    /**
     * 修复核心：使用LogTextField2.LogLevel创建枚举集合
     */
    private void updateLogFilter(CheckBox cbDebug, CheckBox cbInfo, CheckBox cbWarn, CheckBox cbError) {
        // 关键修正：枚举集合类型改为LogTextField2.LogLevel
        EnumSet<LogTextField2.LogLevel> enabledLevels = EnumSet.noneOf(LogTextField2.LogLevel.class);

        // 添加对应级别的枚举（均来自LogTextField2）
        if (cbDebug.isSelected()) enabledLevels.add(LogTextField2.LogLevel.DEBUG);
        if (cbInfo.isSelected()) enabledLevels.add(LogTextField2.LogLevel.INFO);
        if (cbWarn.isSelected()) enabledLevels.add(LogTextField2.LogLevel.WARN);
        if (cbError.isSelected()) enabledLevels.add(LogTextField2.LogLevel.ERROR);

        // 若未选择任何级别，默认显示INFO+WARN+ERROR（同样使用LogTextField2的枚举）
        if (enabledLevels.isEmpty()) {
            enabledLevels.addAll(EnumSet.of(
                    LogTextField2.LogLevel.INFO,
                    LogTextField2.LogLevel.WARN,
                    LogTextField2.LogLevel.ERROR
            ));
            cbInfo.setSelected(true);
            cbWarn.setSelected(true);
            cbError.setSelected(true);
        }

        // 此时参数类型完全匹配，不再报错
        logTextField.setEnabledLevels(enabledLevels);
    }
}